#include "contact_system.h"

static int isLoggedIn = 0;
static char currentUser[MAX_USERNAME] = "";

// 用户注册函数（调用 fileIO 模块写用户）
void registerUser() {
    User newUser;

    printf("\n=== 用户注册 ===\n");
    printf("请输入用户名: ");
    scanf("%29s", newUser.username);
    printf("请输入密码: ");
    scanf("%29s", newUser.password);

    // 检查用户名是否已存在
    if (userExists(newUser.username)) {
        printf("用户名已存在，请选择其他用户名。\n");
        return;
    }

    // 保存用户信息到文件（fileIO 实现）
    saveUserToFile(&newUser);

    printf("注册成功！现在可以登录。\n");
}

// 用户登录函数
int loginUser() {
    char username[MAX_USERNAME], password[MAX_PASSWORD];
    User user;
    FILE *file;

    printf("\n=== 用户登录 ===\n");
    printf("请输入用户名: ");
    scanf("%29s", username);
    printf("请输入密码: ");
    scanf("%29s", password);

    file = fopen("users.dat", "rb");
    if (file == NULL) {
        printf("未找到已注册用户，请先注册。\n");
        return 0;
    }

    int loginSuccess = 0;
    while (fread(&user, sizeof(User), 1, file)) {
        if (strcmp(user.username, username) == 0 && 
            strcmp(user.password, password) == 0) {
            loginSuccess = 1;
            strcpy(currentUser, username);
            break;
        }
    }

    fclose(file);

    if (loginSuccess) {
        printf("登录成功！欢迎 %s！\n", username);
        return 1;
    } else {
        printf("用户名或密码错误！\n");
        return 0;
    }
}

// 一级菜单函数
void mainMenu() {
    int choice;

    // 尝试加载用户数据（fileIO 可能创建或检查文件）
    loadUsersFromFile();

    while(1) {
        printf("\n========================================\n");
        printf("         通讯录管理系统 v2.0\n");
        printf("         （双向链表版本）\n");
        printf("========================================\n");
        printf("1. 用户注册\n");
        printf("2. 用户登录\n");
        printf("3. 退出系统\n");
        printf("========================================\n");
        printf("请选择操作（1-3）: ");

        // 获取用户输入
        if (scanf("%d", &choice) != 1) {
            printf("输入错误，请输入数字！\n");
            while (getchar() != '\n'); // 清空输入缓冲区
            continue;
        }

        switch(choice) {
            case 1:
                registerUser();
                break;
            case 2:
                if (loginUser()) {
                    isLoggedIn = 1;
                    // 进入二级菜单
                    ContactNode *head = initList();
                    loadContactsFromFile(head);
                    secondMenu(head);
                    freeList(head);
                    isLoggedIn = 0;
                }
                break;
            case 3:
                printf("\n感谢使用通讯录管理系统，再见！\n");
                exit(0);
            default:
                printf("无效选择！请输入 1-3 之间的数字。\n");
        }
    }
}

// 二级菜单函数
void secondMenu(ContactNode *head) {
    int choice;
    char name[MAX_NAME];
    int position;

    printf("\n>>> 登录成功！欢迎使用通讯录管理功能 <<<\n");

    do {
        printf("\n========================================\n");
        printf("           通讯录管理菜单\n");
        printf("========================================\n");
        printf(" 1. 创建通讯录（清空现有数据）\n");
        printf(" 2. 添加联系人\n");
        printf(" 3. 查找联系人\n");
        printf(" 4. 修改联系人\n");
        printf(" 5. 删除联系人\n");
        printf(" 6. 插入联系人\n");
        printf(" 7. 显示所有联系人\n");
        printf(" 8. 导出通讯录到文件\n");
        printf(" 9. 按姓名排序\n");
        printf("10. 显示联系人数量\n");
        printf("11. 统计性别分布\n");
        printf("12. 返回主菜单\n");
        printf("========================================\n");
        printf("请选择操作（1-12）: ");

        // 获取用户输入
        if (scanf("%d", &choice) != 1) {
            printf("输入错误，请输入数字！\n");
            while (getchar() != '\n'); // 清空输入缓冲区
            continue;
        }

        switch(choice) {
            case 1:
                // 创建模块 - 清空现有链表，创建新链表
                clearList(head);
                printf("通讯录创建成功！当前为空通讯录。\n");
                break;

            case 2:
                // 添加数据
                addContact(head);
                break;

            case 3:
                // 查找信息（支持按姓名或按编号查找）
                if (getLength(head) == 0) {
                    printf("通讯录为空，无法查找！\n");
                    break;
                }
                printf("请选择查找方式：1. 按姓名  2. 按编号\n");
                printf("请输入选择(1-2): ");
                {
                    int searchChoice = 0;
                    if (scanf("%d", &searchChoice) != 1) {
                        printf("输入错误，请输入数字！\n");
                        while (getchar() != '\n');
                        break;
                    }

                    if (searchChoice == 1) {
                        // 按姓名查找
                        printf("请输入要查找的姓名: ");
                        scanf("%49s", name);
                        ContactNode *found = findContactByName(head, name);
                        if (found != NULL) {
                            printf("\n>>> 找到联系人 <<<\n");
                            printf("编号: %d\n", found->id);
                            printf("姓名: %s\n", found->name);
                            printf("性别: %c\n", found->gender);
                            printf("电话: %s\n", found->phone);
                        } else {
                            printf("未找到姓名为【%s】的联系人！\n", name);
                        }
                    } else if (searchChoice == 2) {
                        // 按编号查找
                        int id = 0;
                        printf("请输入要查找的编号: ");
                        if (scanf("%d", &id) != 1) {
                            printf("输入错误，请输入数字编号！\n");
                            while (getchar() != '\n');
                            break;
                        }
                        ContactNode *found = findContactById(head, id);
                        if (found != NULL) {
                            printf("\n>>> 找到联系人 <<<\n");
                            printf("编号: %d\n", found->id);
                            printf("姓名: %s\n", found->name);
                            printf("性别: %c\n", found->gender);
                            printf("电话: %s\n", found->phone);
                        } else {
                            printf("未找到编号为【%d】的联系人！\n", id);
                        }
                    } else {
                        printf("无效选择，返回上级菜单。\n");
                    }
                }
                break;


            case 4:
                // 修改信息
                if (getLength(head) == 0) {
                    printf("通讯录为空，无法修改！\n");
                    break;
                }
                printf("请输入要修改的联系人姓名: ");
                scanf("%49s", name);
                updateContact(head, name);
                break;

            case 5:
                // 删除信息（按姓名或按编号）
                if (getLength(head) == 0) {
                    printf("通讯录为空，无法删除！\n");
                    break;
                }
                printf("请选择删除方式：1. 按姓名  2. 按编号\n");
                printf("请输入选择(1-2): ");
                {
                    int delChoice = 0;
                    if (scanf("%d", &delChoice) != 1) {
                        printf("输入错误，请输入数字！\n");
                        while (getchar() != '\n');
                        break;
                    }
                    if (delChoice == 1) {
                        printf("请输入要删除的联系人姓名: ");
                        scanf("%49s", name);
                        deleteContactByName(head, name);
                    } else if (delChoice == 2) {
                        int id = 0;
                        printf("请输入要删除的联系人编号: ");
                        if (scanf("%d", &id) != 1) {
                            printf("输入错误，请输入数字编号！\n");
                            while (getchar() != '\n');
                            break;
                        }
                        deleteContactById(head, id);
                    } else {
                        printf("无效选择，返回上级菜单。\n");
                    }
                }
                break;

            case 6:
                // 插入信息
                printf("请输入要插入的位置: ");
                scanf("%d", &position);
                insertContactAtPosition(head, position);
                break;

            case 7:
                // 展示信息（选择正序或逆序）
                if (getLength(head) == 0) {
                    printf("通讯录为空，无法显示！\n");
                    break;
                }
                printf("请选择显示方式：1. 正序  2. 逆序\n");
                printf("请输入选择(1-2): ");
                {
                    int showChoice = 0;
                    if (scanf("%d", &showChoice) != 1) {
                        printf("输入错误，请输入数字！\n");
                        while (getchar() != '\n');
                        break;
                    }
                    if (showChoice == 1) {
                        showContacts(head);
                    } else if (showChoice == 2) {
                        showContactsReverse(head);
                    } else {
                        printf("无效选择，返回上级菜单。\n");
                    }
                }
                break;

            case 8:
                // 导出信息
                exportContactsToText(head);
                break;

            case 9:
                // 按照姓名排序
                if (getLength(head) == 0) {
                    printf("通讯录为空，无法排序！\n");
                    break;
                }
                sortContactsByName(head);
                printf("按姓名排序完成！\n");
                break;

            case 10:
                // 获取链表长度
                printf("当前通讯录中共有 %d 个联系人\n", getLength(head));
                break;

            case 11:
                // 统计性别
                if (getLength(head) == 0) {
                    printf("通讯录为空，无法统计！\n");
                    break;
                }
                countGender(head);
                break;

            case 12:
                // 返回上一级
                saveContactsToFile(head);
                printf("数据已自动保存，返回主菜单...\n");
                return; // 返回到 mainMenu
                break;

            default:
                printf("无效选择！请输入 1-12 之间的数字。\n");
        }

        // 每次操作后暂停一下，让用户看到结果
        if (choice != 12) {
            printf("\n按Enter键继续...");
            while (getchar() != '\n'); // 清空缓冲区
            getchar(); // 等待用户按Enter
        }

    } while(choice != 12);
}

